package ltd.dujiabao.dualwrite.utils;

import java.util.regex.Pattern;
import java.util.regex.Matcher;

/**
 * @author Bowie Du
 * @date 2025/11/1 15:13
 */

public class SqlUtils {
    /**
     * 匹配列名列表部分和值列表部分
     */
    private static final Pattern INSERT_WITHOUT_ID_SQL_PATTERN = Pattern.compile(
            "(insert into\\s+\\w+\\s*\\()([^)]+)(\\)\\s*values\\s*\\()([^)]+)(\\))",
            Pattern.CASE_INSENSITIVE
    );

    private static final Pattern WITH_ID_PATTERN = Pattern.compile("\\([^)]*\\bid\\b[^)]*\\)");


    /**
     * 修改SQL插入语句，确保包含id字段
     *
     * @param sql 原始SQL语句
     * @return 修改后的SQL语句
     */
    public static String ensureIdInInsertSql(String sql) {
        if (sql == null || sql.trim().isEmpty()) {
            return sql;
        }

        // 转换为小写便于检查（但保留原始大小写格式）
        String lowerSql = sql.toLowerCase().trim();

        // 检查是否是INSERT语句
        if (!lowerSql.startsWith("insert into")) {
            return sql;
        }

        // 检查是否已经包含id字段
        if (containsIdField(lowerSql)) {
            return sql;
        }

        if (!checkIfWithoutId(lowerSql)) {
            return sql;
        }

        // 修改SQL，添加id字段
        return addIdToInsertSql(lowerSql);
    }

    /**
     * 检查SQL是否包含id字段
     */
    private static boolean containsIdField(String sql) {
        // 匹配列名列表中的id字段
        Matcher matcher = WITH_ID_PATTERN.matcher(sql);
        return matcher.find();
    }

    /**
     * 检查SQL是否包含id字段
     */
    private static boolean checkIfWithoutId(String sql) {
        // 匹配列名列表中的id字段
        Matcher matcher = INSERT_WITHOUT_ID_SQL_PATTERN.matcher(sql);
        return matcher.find();
    }

    /**
     * 在INSERT语句中添加id字段
     */
    private static String addIdToInsertSql(String sql) {
        Matcher matcher = INSERT_WITHOUT_ID_SQL_PATTERN.matcher(sql);
        if (matcher.find()) {
            // 在列名列表和值列表中都添加id
            String columns = matcher.group(2).trim();
            String values = matcher.group(4).trim();

            // 构建新的SQL
            String newColumns = columns + (columns.isEmpty() ? "id" : ", id");
            String newValues = values + (values.isEmpty() ? "?" : ", ?");

            return matcher.group(1) + newColumns + matcher.group(3) + newValues + matcher.group(5);
        }

        // 如果无法解析，返回原SQL
        return sql;
    }
}
